/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/include/agvNavigate/publicInterfaceInc/public_kernel.h
 * @Description  : 公共AGV数据结构和接口声明，包含AGV的导航、控制和任务管理功能。 
 *                 定义了AGV的工作模式、当前位置、运动控制输出以及多种与导航相关的操作接口。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 16:24:48
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/ 
#pragma once
#include "z_types.h"
#include "task_manager.h"
#include "tools.h"
#include "status.h"
#include "timer.h"
#include <geometry_msgs/msg/twist_stamped.hpp>
#include <geometry_msgs/msg/transform_stamped.hpp>
#include <geometry_msgs/msg/pose_with_covariance_stamped.hpp>
#include "tf2_ros/buffer.h"
#include "tf2_ros/transform_listener.h"
#include "report_run_data.h"
#include "ros_callbacks.h"
#include "public_helper.h"
#include <mutex>
#include "timestamp.h"
#include "node_event.h"
#include "action_state.h"
#include "public_macro.h"
#include "stop_bits.h"
#include "tape_half_auto.h"
struct PublicAgvData {
    // 停止位触发
    NavStopBits stopBitOccur;
    // 任务取消标识
    bool task_cancel;
    // 任务暂停标识
    bool task_pause;
    // 结束充电标识
    bool stop_charging;
    // 车体工作模式
    AgvWorkMode cur_work_mode;
    // 当前的姿态信息
    CurAgvPose agv_pose_data;
    // 运动控制输出速度
    geometry_msgs::msg::TwistStamped ctrl_out_vel;
    // 获取状态监控发出的当前触发的事件
    DataTimeStamp<agv_msgs::msg::AGVEvent> cur_event;
    // 当前订单执行的动作列表
    ActionStateList cur_action_state_list;
    // 通知外部当前的运行状态
    ReportRunData report_run_data;
    // 原地打舵对象
    SteerCmd steer_cmd;
    // 事件上报
    NavNodeEvent node_event;
    // 立即动作控制变量
    InstantControl instant_control;
    // 其他种类的停止信号
    OtherStopSignal stop_signal;
    // 半自动模式下需要使用的数据
    TapeHalfAuto half_auto_line;
    // 静态动作进行时需要的话题数据集合
    OpUseTopic op_data;
    // 初始化状态
    PublicAgvData() : task_cancel(false), task_pause(false), stop_charging(false) {}
};

extern "C"
{
    // 加载地图
    bool LoadMap();
    // 是否是全方位车型
    bool IsOmniDirection();
    // 是否有舵
    bool HasSteer();
    // 获取当前导航类型
    int GetCurNavType();
    // 激光导航是否存在
    bool LaserNavExist();
    // 获取定位位姿-获取区域ID和评分，跨楼层跳转
    bool GetPose(agv_msgs::msg::PoseWithConfidence& ret_pose);
    // 获取当前起始点
    void GetCurRunNode(USHORT& from_node, USHORT& to_node);
    // 获取slam评分
    bool GetSlamScore(float& score);
    // 获取导航定位数据
    bool GetLaserAutoPos(float& x, float& y, float& theta, float& quality, bool allow_timeout = false, bool out_log = true);
    // 强制更新当前位姿(原地矫正后，需要更新小车实际位姿)
    bool ForceUpdataCurPos();
    // 设置暂停预编译标识
    void SetPausePreCompile(bool pause);
    // 通过节点初始化当前位置状态
    int SetInitStateByNode(USHORT at_node_id, USHORT to_node_id);
    // 通过位姿初始化当前状态
    bool SetInitStateByPosture(float x, float y, float theta);
    // 加载初始化状态
    bool LoadInitState();
    // 开始自动导航任务
    void StartNav(bool start, bool online = false);
    // 获取当前控制周期时间
    float GetCtrlCycle();
    // 自动前的预先检测条件是否满足(是否定位数据有效，是否匹配成功路线)
    bool AutoPreCheck();
    // 初始化开启自动运行时定时器
    int InitMainTimer();
    bool InitAutoTaskTimer();
    // 强制暂停任务
    void ForceSetPauseTask(bool pause);
    // 是否取消当前任务
    bool CancelCurTask();
    // 是否暂停当前任务
    bool ReadyPauseTask();
    // 状态监控返回当前的事件
    uint8_t EventOccur();
    // 获取限速值 2023.1.5 add by haibo
    float GetVelLimit();
    // 设置不同种类的停止信号
    void SetStopCategory(StopType type, bool occur);
    // 其他种类的停车信号；是否底盘在原地打舵等
    int OtherStopSignal();
    // 其他缓慢停止信号
    bool OtherSlowStopSignal();
    // 设置取消当前任务
    void SetCancelTask(bool cancel);
    // 控制agv设置0速度
    void SetAgvToStop();
    // 自动运行时,运动控制输出的速度矢量
    void SetAutoModeNavVel(const float& linear_x, const float& linear_y, const float& angular_z);
    // 清除导航起始节点记录
    void ClearNavNodeIdRecord();
    // 解析当前操作模式 2023.12.19 modify by haibo
    uint64_t AnalysisMode(uint8_t state);
    // 获取挡前的工作模式
    AgvWorkMode GetCurMode();
    // 调试导航
    void DebugNav();
    // 初始化基础运动参数
    void Init(rclcpp::Node::SharedPtr node);
    void InitNodeMotionParam();
    void InitMotionParam();
    // 添加新的订单任务
    bool AddOfflineOrderTask(const agv_srvs::srv::LocalOrder::Request& order_task_req);
    bool AddOnlineOrderTask(const agv_msgs::msg::Order& order_task);
    bool UpdateActionListStates(agv_msgs::msg::ActionState new_state);
    bool HandleInstantActions(std::vector<agv_msgs::msg::Action> instant_actions);
    void UpdateActionStateId(long long new_id, uint32_t update_id);
    agv_msgs::msg::ActionState SetActionState(const agv_msgs::msg::Action& action, const std::string& status);

    // 初始化预告运行时数据线程
    bool InitReportThread();
    bool SetReportAutoMode(bool enable);
    void ChangeNavMode(USHORT mode);
    // 设置路段属性值
    void SetNavPathPointWordData(const int& word1, const int& word2);
    void SetNavPathWordData(const int& word1, const int& word2);
    void SetNavPathBitsData(const uint16_t& bits);
    void SetNavPathScenesData(const std::string& scenes);
    void FirstSetPathBitsData();
    // 获取运行路径属性数据
    RunPathProperty GetRunPathProperty();
    // 告知二维码节点，当前轨迹类型
    void ChangeTrajType(int type);
    // 结束充电标志 设置  获取
    void SetStopCharging(bool charging);
    // 获取结束充电结束标识
    bool GetStopCharging();
    // 设置充电是否开启结束
    bool SetChargeIo(bool open);
    // 理论规划控制速度
    geometry_msgs::msg::TwistStamped& GetControlVel();
    // 设置小车控制
    void SetVehicleControl(agv_msgs::msg::Action action);
}
